# js107_rule.py
import sys
from pathlib import Path

# 获取 template 目录的绝对路径（根据实际结构调整）
current_file = Path(__file__)
template_dir = current_file.parent.parent  # 上两级目录

sys.path.append(str(template_dir))

# 现在可以正常导入
from utils import date_offset_handler, generate_random_data_with_params
from base_rule import BaseRule
from DataProcessor import DataProcessor
import pandas as pd


class JS107_Rule(BaseRule):
    def __init__(self, project_info):
        super().__init__("JS107", project_info)
        instance_values = project_info.get("instance_values", {})

        # 调试输出：查看传入的数据结构
        print("[DEBUG] JS107 Rule 初始化数据:")
        print("project_info 内容:", project_info)
        print("instance_values 内容:", instance_values)

        # 提取配置参数
        self.JS107RULE_TYPE = instance_values.get("JS107规则类型", "1")

        # 安全提取字段，并转换为浮点数
        def safe_float(value, default=None):
            try:
                return float(value)
            except (TypeError, ValueError):
                return default

        base_width = safe_float(instance_values.get("基础宽度"))
        base_thickness = safe_float(instance_values.get("基础厚度"))
        base_top_elevation = safe_float(instance_values.get("基础顶高程"))

        print(f"[DEBUG] 提取字段值: 基础宽度={base_width}, 基础厚度={base_thickness}, 基础顶高程={base_top_elevation}")

        # 添加通用字段
        self.add_field("桩号、部位", lambda _: self.project_info['施工部位'])
        self.add_field("施工日期", date_offset_handler(0), data_type="date", format="%Y年%m月%d日")
        self.add_field("检测、记录日期", date_offset_handler(0), data_type="date", format="%Y年%m月%d日")

        if self.JS107RULE_TYPE == "1":
            # 【类型1】写入字段
            for i, item in enumerate(['平面尺寸（mm）','基础底面高程（mm）','基础顶面高程（mm）','轴线偏位（mm）']):
                self.add_field(f"核验项目{i+1}", lambda _, val=item: val)

            if base_width is not None:
                self.add_field("平面尺寸（mm）",
                               generate_random_data_with_params(
                                   frequency=5,
                                   range_param=[-50.0, 50.0],
                                   base=base_width,
                                   decimal=0),
                               data_type="list_horizontal",
                               target_cells=['D10', 'E10', 'F10', 'G10', 'H10'])

            if base_thickness is not None:
                self.add_field("基础底面高程（mm）",
                               generate_random_data_with_params(
                                   frequency=5,
                                   range_param=[-50.0, 50.0],
                                   base=base_thickness,
                                   decimal=0),
                               data_type="list_horizontal",
                               target_cells=['D13', 'E13', 'F13', 'G13', 'H13'])

            if base_top_elevation is not None:
                self.add_field("基础顶面高程（mm）",
                               generate_random_data_with_params(
                                   frequency=5,
                                   range_param=[-30.0, 30.0],
                                   base=base_top_elevation,
                                   decimal=0),
                               data_type="list_horizontal",
                               target_cells=['D16', 'E16', 'F16', 'G16', 'H16'])

            self.add_field("轴线偏位（mm）",
                           generate_random_data_with_params(
                               frequency=5,
                               range_param=[0.0, 25.0],
                               decimal=0),
                           data_type="list_horizontal",
                           target_cells=['D19', 'E19', 'F19', 'G19', 'H19'])

        else:
            # 【类型2】使用相同的单元格区域
            for i, item in enumerate(['管座或垫层宽度、厚度','相邻管节底面错台']):
                self.add_field(f"核验项目{i+1}", lambda _, val=item: val)

            self.add_field("管座或垫层宽度、厚度",
                           generate_random_data_with_params(
                               frequency=5,
                               range_param=[-50.0, 50.0],
                               decimal=0),
                           data_type="list_horizontal",
                           target_cells=['D10', 'E10', 'F10', 'G10', 'H10'])

            self.add_field("相邻管节底面错台",
                           generate_random_data_with_params(
                               frequency=5,
                               range_param=[-50.0, 50.0],
                               decimal=0),
                           data_type="list_horizontal",
                           target_cells=['D13', 'E13', 'F13', 'G13', 'H13'])

    def process(self, **kwargs):
        """
        封装处理逻辑，直接返回结果
        :param data_file_path: 数据文件路径（Excel/CSV）
        :return: 处理后的 DataFrame
        """
        data_file_path = current_file.parent / '模板数据.xlsx'
        df = pd.read_excel(data_file_path)
        rules = self.get_rules()

        processor = DataProcessor(base_data=df, project_info=self.project_info, rules=rules)
        results = processor.process_dataframe(df)

        # 根据规则类型删除不需要的字段
        if self.JS107RULE_TYPE == "1":
            fields_to_remove = [
                '管座或垫层宽度、厚度',
                '相邻管节底面错台'
            ]
        else:
            fields_to_remove = [
                '平面尺寸（mm）',
                '基础底面高程（mm）',
                '基础顶面高程（mm）',
                '轴线偏位（mm）'
            ]

        results = results[~results['内容名称'].isin(fields_to_remove)]

        return results
if __name__ == "__main__":
    PROJECT_BASE_INFO ={
    '施工单位':'浙江交工宏途交通建设有限公司',
    '监理单位':'浙江浙中建设工程管理有限公司',
    '单位工程':'路基工程',
    '分部工程':'涵洞、通道',
    '分项工程':'主体结构',
    '施工日期':'2024/05/31',
    '施工部位':'K59+639圆管涵',
    '设计坐标(X,Y)':(3243273.926,509154.842),
    '长':44.5,#圆管涵长度
    '宽':4,#圆管涵宽度
    '基础宽度':2759,
    '基础厚度':300,
    '基础顶高程':66035,
    '设计高程':66,#基础高程
    '断面尺寸长度':1250,
    '断面尺寸宽度':275.9,
    '断面尺寸高(厚)度':30,
    '基础混凝土强度（砂浆）等级':'C25',
    '基础设计混凝土（砂浆）用量':'15',
    '基础实际混凝土（砂浆）用量':'16',
    '护壁混凝土强度（砂浆）等级':'C25',
    '护壁设计混凝土（砂浆）用量':'15',
    '护壁实际混凝土（砂浆）用量':'16',
    'JS107规则类型':'2',
} 

    rule = JS107_Rule(PROJECT_BASE_INFO)
    results = rule.process()
    fields_to_remove=[['管座或垫层宽度、厚度','相邻管节底面错台']]
    results[results["单元格编号"].isin(fields_to_remove)]
    print(results)

    
    